package figuras;

import javax.media.opengl.GL;

import dataType.InterseccionRectaSegmento;

public class Recta {

	private PuntoVector punto1;
	private PuntoVector punto2;

	public Recta() {
		this.punto1 = new PuntoVector();
		this.punto2 = new PuntoVector();
	}

	public Recta(PuntoVector e1, PuntoVector e2) {
		this.punto1 = e1;
		this.punto2 = e2;
	}

	public PuntoVector obtenVectorDirector() {
		double x = punto2.getX() - punto1.getX();
		double y = punto2.getY() - punto1.getY();
		double z = punto2.getZ() - punto1.getZ();
		return new PuntoVector(x, y, z, 0);
	}
	
	public PuntoVector interseccionConSegmento(Segmento seg){
		PuntoVector puntoInterseccion=null;
		InterseccionRectaSegmento interseccion=this.hayInterseccion(seg);
		if(interseccion.isHayInterseccion()){
			PuntoVector vectorDirector=this.obtenVectorDirector();
			vectorDirector.escalacion(interseccion.getT1());
			double x=punto1.getX()+vectorDirector.getX();
			double y=punto1.getY()+vectorDirector.getY();
			double z=punto1.getZ()+vectorDirector.getZ();
			puntoInterseccion=new PuntoVector(x,y,z,1);
		}
		
		return puntoInterseccion;
	}

	private InterseccionRectaSegmento hayInterseccion(Segmento seg) {
		InterseccionRectaSegmento result=new InterseccionRectaSegmento();
		result.setHayInterseccion(false);
		PuntoVector vectorRecta = this.obtenVectorDirector();
		PuntoVector vectorSegmento = seg.obtenVectorDirector();
		PuntoVector vectorPerpendicularRecta=vectorRecta.perpendicularIzquierda();
		PuntoVector vectorPerpendicularSegmento=vectorSegmento.perpendicularIzquierda();
		double x1 = seg.getExtremo1().getX() - punto1.getX();
		double y1 = seg.getExtremo1().getY() - punto1.getY();
		double z1 = seg.getExtremo1().getZ() - punto1.getZ();
		PuntoVector a1a2=new PuntoVector(x1, y1, z1, 0);
		double x2 = punto1.getX()-seg.getExtremo1().getX();
		double y2 = punto1.getY()-seg.getExtremo1().getY();
		double z2 = punto1.getZ()-seg.getExtremo1().getZ();
		PuntoVector a2a1=new PuntoVector(x2, y2, z2, 0);
		double denominador1=vectorRecta.productoEscalar(vectorPerpendicularSegmento);
		double denominador2=vectorPerpendicularRecta.productoEscalar(vectorSegmento);
		if((denominador1==0)||(denominador2==0)) result.setHayInterseccion(false);
		else{
			result.setT1(a1a2.productoEscalar(vectorPerpendicularSegmento)/denominador1);
			double t2=a2a1.productoEscalar(vectorPerpendicularRecta)/denominador2;
			result.setT2(t2);
			//si t2 no esta ente 0 y 1 no hay interseccion
			if((0<=t2)&&(t2<=1)) result.setHayInterseccion(true);
		}		
		return result;
	}

	public PuntoVector getPunto1() {
		return punto1;
	}

	public void setPunto1(PuntoVector punto1) {
		this.punto1 = punto1;
	}

	public PuntoVector getPunto2() {
		return punto2;
	}

	public void setPunto2(PuntoVector punto2) {
		this.punto2 = punto2;
	}

	public void dibuja(GL gl) {
		gl.glBegin(GL.GL_LINES);
		gl.glVertex2d(punto1.getX(), punto1.getY());
		gl.glVertex2d(punto2.getX(), punto2.getY());
		gl.glEnd();
		
	}
}